package com.atguigu.d_staticclassinclass;
/*
    1. 在成员内部类中访问外部类成员 :
        在静态成员内部类的方法内创建外部类对象,使用外部类对象调用外部类成员

    2. 在外部类中访问内部类成员 :
        创建内部类对象 使用内部类对象去访问内部类成员

    3. 在第三方类中创建外部类对象 访问内部类成员 : 弄不了

    4. 在第三方类中创建内部类对象 访问内部类成员 :
        创建内部类对象 : Outer.Inner inner = new Outer().new Inner();
        创建静态内部类对  : Outer.Inner inner = new Outer.Inner();
 */
public class Demo {
    public static void main(String[] args) {
        //创建外部类对象
        Outer outer = new Outer();

        //创建内部类对象
        Outer.Inner inner = new Outer.Inner();

    }
}

//外部类
class Outer{
    int num = 111;
    int numOut = 222;
    public void method(){
        System.out.println("外部类的method");
    }

    public void methodOut(){
        System.out.println("methodOut");
    }

    public void test(){
        //访问内部类成员
        Inner inner = new Inner();

    }

    //静态成员内部类
    static class Inner{ //static : inner内部类相对外部类静态
        int num = 100;
        int numIn = 200;
        public void method(){
            System.out.println("内部类的method");
        }

        public void methodIn(){
            System.out.println("methodIn");
        }

        public void test(){
            //在静态成员内部类中访问外部类成员
            //静态只能访问静态
//            System.out.println("numOut = " + numOut);
//            methodOut();

            //内部类自己的
            System.out.println("num = " + Inner.this.num);
            this.method();

            //System.out.println("Outer.this.num = " + Outer.this.num);

            //创建外部类对象
            Outer outer = new Outer();
            System.out.println("outer.num = " + outer.num);
            System.out.println("outer.numOut = " + outer.numOut);
            outer.method();
            outer.methodOut();
        }
    }

}


